package com.all.ipregion.service;

import cn.hutool.core.util.StrUtil;
import org.lionsoul.ip2region.xdb.Searcher;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;

import java.io.InputStream;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;

/**
 * @Author LY
 * @create 2024/4/28 16:35
 * @Description 解析ip地址属性
 */
@Service
public class SearcherService {

    /**
     * IP地址
     * @param ip ip地址
     * @return 归属地
     */
    public String getRegion(String ip) {
        try {
            // 文件读取
            InputStream inputStream = new ClassPathResource("ip2region.xdb").getInputStream();
            // 输入流转换字节流
            byte[] dbBinStr = FileCopyUtils.copyToByteArray(inputStream);
            // 创建一个完全基于内存的查询对象
            Searcher searcher = Searcher.newWithBuffer(dbBinStr);
            long sTime = System.nanoTime();
            // 中国|0|上海|上海市|联通；美国|0|犹他|盐湖城|0
            String regionInfo = searcher.search(ip);
            String region = getCityInfo(regionInfo, ip);
            long cost = TimeUnit.NANOSECONDS.toMicros((System.nanoTime() - sTime));
            System.out.printf("{具体详细地址 : %s, IP属地 : %s, ip: %s, 耗时: %d 纳秒}\n", regionInfo, region, ip, cost);
            return region;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.printf("IP地址异常 (%s) : %s\n", ip, e);
            return null;
        }
    }

    /**
     * 解析城市信息，国内显示城市名，国外显示国家名
     */
    private String getCityInfo(String regionInfo, String ip) {
        if (!StrUtil.isEmpty(regionInfo)) {
            //-------------------------------------------------------
            //searchIpInfo 的数据格式： 国家|区域|省份|城市|ISP
            //192.168.31.160 0|0|0|内网IP|内网IP
            //47.52.236.180 中国|0|香港|0|阿里云
            //220.248.12.158 中国|0|上海|上海市|联通
            //164.114.53.60 美国|0|华盛顿|0|0
            HashMap<String, String> cityInfo = new HashMap<>();
            String[] splitIpInfo = regionInfo.split("\\|");
            cityInfo.put("ip",ip);// 查询的ip地址
            cityInfo.put("searchInfo", regionInfo);// 解析的信息
            cityInfo.put("country",splitIpInfo[0]);// 国家
            cityInfo.put("region",splitIpInfo[1]);// 区域
            cityInfo.put("province",splitIpInfo[2]);// 省份
            cityInfo.put("city",splitIpInfo[3]);// 城市
            cityInfo.put("ISP",splitIpInfo[4]);// 互联网服务提供商
            System.out.println("详细信息 : " + cityInfo);
            //--------------国内属地返回省份--------------
            if ("中国".equals(cityInfo.get("country"))){
                return cityInfo.get("province");
            }
            //------------------内网 IP----------------
            if ("0".equals(cityInfo.get("country"))){
                if ("内网IP".equals(cityInfo.get("ISP"))){
                    return "内网IP";
                }
                else return "";
            }
            //--------------国外属地返回国家--------------
            else {
                return cityInfo.get("country");
            }
        }
        return "未知IP";
    }
}
